// 配置路由的地方
import Vue from 'vue';
import VueRouter from 'vue-router';
import routes from './routes'
import store from '@/store'
// 使用路由
Vue.use(VueRouter);
// 先把VueRouter原型对象的push保存一份
let origionPush=VueRouter.prototype.push;
let origionReplace=VueRouter.prototype.replace;
// 重写push|replace
// 第一个参数：告诉原来push方法，你往哪里跳转（传递哪些参数）
// 第二个参数：成功的回调
// 第三个参数：失败的回调，名字随便起
VueRouter.prototype.push=function(location,resolve,reject){
   if(resolve && reject){
    //    call || apply区别
    // 相同点：都可以调用函数一次，都可以纂改函数的上下文一次
    // 不同点：call与apply传递参:call传递参数用逗号隔开，apply用传递数组
       origionPush.call(this,location,resolve,reject);
   }else{
       origionPush.call(this,location,()=>{},()=>{});
   }
}
VueRouter.prototype.replace=function(location,resolve,reject){
    if(resolve && reject){
           origionReplace.call(this,location,resolve,reject);
       }else{
           origionReplace.call(this,location,()=>{},()=>{});
       }
}
let router= new VueRouter({    // 配置路由
    routes,
    scrollBehavior(to,from,savedPosition){
        // y的值可以任意设置，指的是距离顶部的像素值
        return {y:0};
    }
})
// 全局前置守卫，在路由跳转的路上进行守卫
router.beforeEach(async (to,from,next)=>{
    // to即将要跳转的路由
    // from 从哪个路由而来
    // next放行函数   next()放行  next(path)放行到指定路由  next(false)
    let token=store.state.user.token;
    let name=store.state.user.userInfo.name;
    if(token){
        // 如果用户登录，要跳转到其他页面，需要判断跳转的页面是不是登录页面，
        // 因为已经登录了所以不能跳转登录页面,默认跳到首页去
        if(to.path=="/login"){
            next("/home")
        }else{
            // 如果跳转的是除了login以外的页面，则需要判断这些页面是否有用户的信息可以进行展示
            // （之前说过因为store不是持久化存储，跳转到其他页面，可能仓库中的用户信息已经没有了）
            // 因此需要在跳转过去之前重新请求数据
             if(name){
                // 如果有用户信息，则正常跳转
                next()
             }else{
                try {
                    // 因为路由这里有了，因此home页面的这个派发事件可以去掉
                    await store.dispatch("getUserInfo");
                    next();
                } catch (error) {
                    // token失效 获取不到用户信息，重新登录
                    // 需要清除token
                    await store.dispatch('userLoginOut');
                    next("/login");
                }

             }
        }
    }else{
        // 用户没有登录时
        let toPath=to.path;
        if(toPath.indexOf('/center')!=-1 || toPath.indexOf('/trade')!=-1 || toPath.indexOf('/pay')!=-1 || toPath.indexOf('/shopCart')!=-1) {
            // 把未登录时想要去而没有去成的地址信息存储于地址栏中，在login页面登录成功的时候进行跳转到想要去的页面
            next("/login?redirect="+toPath);
        }else{
            // 去的不是以上受限制页面的时候放行
            next();
        }
        
        
    }
    
})
export default router;